
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource; // JDBC 所在的包，用于提供 JDBC 的 类和方法。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class TestJDBC {
    public static void main(String[] args) throws SQLException {
        Scanner sc = new Scanner(System.in);

        // 1、创建好数据源
        // DataSource 就是 JDBC 当中一个重要的 “类”（实际上它是接口）
        DataSource dataSource = new MysqlDataSource();
        // 设置数据库所在的地址
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
        // 设置 登录数据库的用户名
        ((MysqlDataSource)dataSource).setUser("root");
        //  设置登录数据库的密码
        ((MysqlDataSource)dataSource).setPassword("123456");


        //2、让代码与数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        // 在进行 第三步之前，我们输入指定的数据
        System.out.println("请输入学号：");
        int id = sc.nextInt();
        System.out.println("请输入名字：");
        String name = sc.next();


        //3、进行操作数据库：以插入数据为例
        //关键所在就是构造一个 SQL 语句。
        String sql = "insert into student values(?,?)";
        //但是呢，光有一个String类型的SQL还不行。需要把这个String 包装成一个“语句对象”。
        PreparedStatement preparedStatement= connection.prepareStatement(sql);

        // 进行替换操作
        preparedStatement.setInt(1,id);
        preparedStatement.setString(2,name);
        // 输出一下，动态拼接SQL的结果
        System.out.println("preparedStatement:" + preparedStatement);

        //4、执行SQL:真正访问数据库服务器，插入数据
        // SQL 里面的 insert、update、delete，都是是哦用 executeUpdate 方法
        // 【可以这么理解：这三操作其实都是在更新数据。而 executeUpdate 的中文意思就是执行更新】
        //  select 很特殊，使用的是 executeQuery 方法。
        // 【而 select 不涉及数据更新操作，它只是查询数据的内容。executeQuery的中文意思就是 执行询问/执行查询】
        int ret = preparedStatement.executeUpdate();
        //  preparedStatement.executeUpdate() 就是拿着我们构造好的 语句对象去进行相应的操作。
        // 并且它会返回一个整数，意思就是 这个操作 影响到了几行
        System.out.println(ret);

        //5、此时 SQL 已经执行完毕，然后需要我们去释放资源
        preparedStatement.close();
        connection.close();
        sc.close();// 这个可以不写，作者习惯性写的
    }
}
